import tkinter as tk
from tkinter import messagebox

def hex_to_decimal(hex_str):
    """将4字节的十六进制字符串转换为十进制数"""
    try:
        # 移除0x前缀（如果有的话）
        hex_str = hex_str.replace("0x", "").replace("0X", "")
        
        # 确保输入长度正确（4字节 = 8个十六进制字符）
        if len(hex_str) > 8:
            raise ValueError("输入超过4字节长度")
        
        # 将输入补齐到8个字符
        hex_str = hex_str.zfill(8)
        
        # 转换为整数
        value = int(hex_str, 16)
        
        # 处理有符号整数（如果最高位为1，则为负数）
        if value & 0x80000000:
            value = -((~value & 0xFFFFFFFF) + 1)
        
        return value
    except ValueError as e:
        raise ValueError("无效的十六进制输入")

def decimal_to_hex(decimal_str):
    """将十进制数转换为4字节的十六进制字符串"""
    try:
        # 转换输入为整数
        value = int(decimal_str)
        
        # 检查范围是否在4字节整数范围内
        if value < -2147483648 or value > 2147483647:
            raise ValueError("数值超出4字节整数范围")
        
        # 对于负数，转换为对应的无符号值
        if value < 0:
            value = (abs(value) ^ 0xFFFFFFFF) + 1
        
        # 转换为8位十六进制字符串
        return format(value & 0xFFFFFFFF, '08X')
    except ValueError:
        raise ValueError("无效的十进制输入")

class NumberConverterGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("进制转换器")
        self.root.geometry("400x300")
        
        # 创建框架
        main_frame = tk.Frame(root, padx=20, pady=20)
        main_frame.pack(expand=True)
        
        # 十六进制输入
        tk.Label(main_frame, text="十六进制 (4字节):", font=('Arial', 10)).pack()
        self.hex_entry = tk.Entry(main_frame, font=('Arial', 12))
        self.hex_entry.pack(fill='x', pady=(0,10))
        
        # 转换按钮
        button_frame = tk.Frame(main_frame)
        button_frame.pack(pady=10)
        
        tk.Button(button_frame, text="↓ 转换到十进制", command=self.hex_to_dec).pack(side='left', padx=5)
        tk.Button(button_frame, text="↑ 转换到十六进制", command=self.dec_to_hex).pack(side='left', padx=5)
        tk.Button(button_frame, text="清除", command=self.clear_all).pack(side='left', padx=5)
        
        # 十进制输入
        tk.Label(main_frame, text="十进制:", font=('Arial', 10)).pack()
        self.decimal_entry = tk.Entry(main_frame, font=('Arial', 12))
        self.decimal_entry.pack(fill='x', pady=(0,10))
        
        # 提示标签
        self.status_label = tk.Label(main_frame, text="", fg="red")
        self.status_label.pack(pady=10)

    def hex_to_dec(self):
        """十六进制转换为十进制"""
        self.status_label.config(text="")
        hex_input = self.hex_entry.get().strip()
        if not hex_input:
            self.status_label.config(text="请输入十六进制数")
            return
        
        try:
            result = hex_to_decimal(hex_input)
            self.decimal_entry.delete(0, tk.END)
            self.decimal_entry.insert(0, str(result))
        except ValueError as e:
            self.status_label.config(text=str(e))

    def dec_to_hex(self):
        """十进制转换为十六进制"""
        self.status_label.config(text="")
        dec_input = self.decimal_entry.get().strip()
        if not dec_input:
            self.status_label.config(text="请输入十进制数")
            return
        
        try:
            result = decimal_to_hex(dec_input)
            self.hex_entry.delete(0, tk.END)
            self.hex_entry.insert(0, result)
        except ValueError as e:
            self.status_label.config(text=str(e))

    def clear_all(self):
        """清除所有输入"""
        self.hex_entry.delete(0, tk.END)
        self.decimal_entry.delete(0, tk.END)
        self.status_label.config(text="")

if __name__ == "__main__":
    root = tk.Tk()
    app = NumberConverterGUI(root)
    root.mainloop()